package com.wquick.base.utils

import android.app.Activity
import android.app.ActivityManager
import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.PowerManager
import android.provider.Settings
import androidx.annotation.RequiresApi


/**
 *
 * <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
 *
在后台中运行的 Service 会消耗设备资源，这可能会降低用户体验。 为了缓解这一问题，系统对这些 Service 施加了一些限制。

如果满足以下任意条件，应用将被视为处于前台：

具有可见 Activity（不管该 Activity 已启动还是已暂停）。
具有前台 Service。
另一个前台应用已关联到该应用（不管是通过绑定到其中一个 Service，还是通过使用其中一个内容提供程序）。 例如，如果另一个应用绑定到该应用的 Service，那么该应用处于前台：
IME（输入法）
壁纸 Service
通知侦听器
语音或文本 Service
如果以上条件均不满足，应用将被视为处于后台。

 *
 * 忽略电池优化
 *
 * @constructor Create empty Ignoring battery optimizations
 */
object IgnoringBatteryOptimizations {

    /**
     *
     * 申请忽略电池优化
     *
     * Request ignore battery optimizations
     *
     */
    @RequiresApi(api = Build.VERSION_CODES.M)
    fun requestIgnoreBatteryOptimizations(activity: Activity) {
        with(activity) {
            if (isIgnoringBatteryOptimizations(activity)) return
            try {
                val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
                intent.data = Uri.parse("package:" + applicationContext.packageName)
                startActivity(intent)
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }

    /**
     *
     * 判断是否开启电池优化
     * Is ignoring battery optimizations
     *
     * @return
     */
    @RequiresApi(api = Build.VERSION_CODES.M)
    fun isIgnoringBatteryOptimizations(ctx: Context): Boolean {
        with(ctx) {
            var isIgnoring = false
            val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager?
            if (powerManager != null) {
                isIgnoring = powerManager.isIgnoringBatteryOptimizations(applicationContext.packageName)
            }
            return isIgnoring
        }
    }

    /**
     *
     * 在多任务列表页面隐藏App窗口
     *
     * Hide app window
     *
     * @param isHide
     */
    fun hideAppWindow(ctx: Context, isHide: Boolean = true) {
        with(ctx) {
            try {
                val activityManager: ActivityManager =
                    getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
                //控制App的窗口是否在多任务列表显示
                activityManager.appTasks[0].setExcludeFromRecents(isHide)
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }


    fun findActivity(ctx: Context): Activity {
        var context = ctx
        while (context is ContextWrapper) {
            if (context is Activity) return context
            context = context.baseContext
        }
        throw IllegalStateException("Permissions should be called in the context of an Activity")
    }
}